'use strict';
const Controller = require('egg').Controller;
const regexpRules = require('../utils/regexpRules');
const ExcelMod = require("zl-excel");
const dayjs = require('dayjs');

class FieldsController extends Controller {
    async addFields() {
        const { ctx } = this;
        let query = ctx.request.body;
        if (!query.zh) {
            ctx.body = {
                result: 'false',
                resultDes:'中文描述(zh)参数不能为空'
            }
            return;
        }

        if (typeof query.zh !== 'string') {
            ctx.body = {
                result: 'false',
                resultDes:'中文描述(zh)参数必须是字符串'
            }
            return;
        }
        if (!query.key) {
            ctx.body = {
                result: 'false',
                resultDes:'语言key参数不能为空'
            }
            return;
        }

        if(!regexpRules.libKey.test(query.key)) {
            ctx.body = {
                result: 'false',
                resultDes:'字段名只能包含英文、数字、简体中文汉字、下划线、中划线、斜杠（/）'
            }
            return;
        }
        if (!query.lib_id) {
            ctx.body = {
                result: 'false',
                resultDes:'lib_id参数不能为空'
            }
            return;
        }

        const result = await ctx.service.languageFields.add(query);
        ctx.body = result || {
            result: 'false',
            resultDes: '操作失败'
        }
    }

    async updateFields(){
        const { ctx } = this;
        let query = ctx.request.body;
        if (!query.id) {
            ctx.body = {
                result: 'false',
                resultDes:'id不能为空'
            }
            return;
        }
        if (!query.zh) {
            ctx.body = {
                result: 'false',
                resultDes:'中文描述(zh)参数不能为空'
            }
            return;
        }

        if (!query.key) {
            ctx.body = {
                result: 'false',
                resultDes:'语言key参数不能为空'
            }
            return;
        }

        if(!regexpRules.libKey.test(query.key)) {
            ctx.body = {
                result: 'false',
                resultDes:'字段名只能包含英文、数字、下划线、中划线、中文'
            }
            return;
        }

        if (!query.lib_id) {
            ctx.body = {
                result: 'false',
                resultDes:'lib_id参数不能为空'
            }
            return;
        }

        const result = await ctx.service.languageFields.update(query);
        ctx.body = result || {
            result: 'false',
            resultDes: '操作失败'
        }
    }

    async updateEnById(){
        const { ctx } = this;
        let query = ctx.request.body;
        if (!query.id) {
            ctx.body = {
                result: 'false',
                resultDes:'id不能为空'
            }
            return;
        }
        if (!query.lib_id) {
            ctx.body = {
                result: 'false',
                resultDes:'语言包id不能为空'
            }
            return;
        }
        if (!query.en) {
            ctx.body = {
                result: 'false',
                resultDes:'英文不能为空'
            }
            return;
        }
        if (!query.key) {
            ctx.body = {
                result: 'false',
                resultDes:'key不能为空'
            }
            return;
        }
        const result = await ctx.service.languageFields.updateEnById(query);
        ctx.body = result || {
            result: 'false',
            resultDes: '操作失败'
        }

    }

    /**
     * 根据父id和key更新字段
     * */
    async updateFieldsByParentIdAndKey(){
        const { ctx } = this;
        let query = ctx.request.body;
        if (!query.parentId) {
            ctx.body = {
                result: 'false',
                resultDes:'parentId不能为空'
            }
            return;
        }
        if (!query.libId) {
            ctx.body = {
                result: 'false',
                resultDes:'libId不能为空'
            }
            return;
        }

        if (!query.key) {
            ctx.body = {
                result: 'false',
                resultDes:'语言key参数不能为空'
            }
            return;
        }

        //语言类型不能，取值 zh, en 分别代表不同的语言
        if (!query.langType) {
            ctx.body = {
                result: 'false',
                resultDes:'语言类型参数langType不能为空'
            }
            return;
        }

        //语言类型不能，取值 zh, en 分别代表不同的语言
        if (!query.langValue) {
            ctx.body = {
                result: 'false',
                resultDes:'语言值langValue不能为空'
            }
            return;
        }

        const result = await ctx.service.languageFields.updateFieldsByParentIdAndKey(query);
        ctx.body = result || {
            result: 'false',
            resultDes: '操作失败'
        }
    }

    /**
     * request.body的可传参数有:
     * keyword: ""  搜索关键词
     * lib_id: 37 语言包id
     * pageNo: 1  当前页码
     * pageSize: 50 每页条数
     * parent_id: "" 字段的父级id
     * is_exact_match: true 是否精确匹配, 默认：是
     * */
    async getList(){
        const { ctx } = this;
        let query = ctx.request.body;
        //必传参数校验
        if (!query.pageSize) {
            ctx.body = {
                result: 'false',
                resultDes:'pageSize不能为空'
            }
            return;
        }
        if (!query.pageNo) {
            ctx.body = {
                result: 'false',
                resultDes:'pageNo不能为空'
            }
            return;
        }
        if (!query.lib_id) {
            ctx.body = {
                result: 'false',
                resultDes:'语言包id不能为空'
            }
            return;
        }
        const result = await ctx.service.languageFields.list(query);
        ctx.body = result || {
            result: 'false',
            resultDes: '操作失败'
        }
    }

    /**
     * 导出Excel
     * 请求参数 query Object
     * lib_id 语言包id
     * lib_name 语言包名称
     * is_empty_en 是否过滤出英文为空的， 1：是，0：否
     * pageNo 当前页面
     * pageSize 当前每页条数
     * */
    async exportExcel(){
        const { ctx } = this;
        let query = ctx.query;

        if (!query.lib_id) {
            ctx.body = {
                result: 'false',
                resultDes:'语言包id不能为空'
            }
            return;
        }
        if (!query.lib_name) {
            ctx.body = {
                result: 'false',
                resultDes:'语言包name不能为空'
            }
            return;
        }

        const params = {
            ...query,
            pageNo:query.pageNo || '1',
            pageSize: query.pageSize || '10000',
            is_empty_en: query.is_empty_en,
            from:'exportExcel'
        }
        const result = await ctx.service.languageFields.list(params);
        if(result){
            const str = '（请勿修改）'
            const excelInfo  = [
                {
                    sheetName: '多语言包中英文对照', // 第一个sheet的名字
                    columns: [
                        { header: 'ID' + str, key: 'id', width: 20 },
                        { header: 'KEY' + str, key: 'key', width: 20 },
                        { header: '模块名'+ str, key: 'module_name', width: 20 },
                        { header: '中文（Chinese）', key: 'zh', width: 30 },
                        { header: '英文（English）', key: 'en', width: 30 },
                    ],
                    rows: result.list.map(item => {
                        return {
                            id: item.id,
                            module_name: item.module_name,
                            key:[...(item.parent_key? item.parent_key.split(',') : []), item.key].join('.'),
                            zh: item.zh,
                            en: item.en
                        }
                    }),
                },
            ]
            //将表格返回到调用处
            const workbook = await ExcelMod.getWorkbook({
                excelData: excelInfo,
                cellDefaultStyle: {alignment: { wrapText: true, vertical: 'middle', horizontal: 'left' }}
            })

            // 设置表格信息请求头，然后进行导出到前端
            const fileName = encodeURIComponent(query.lib_name + '-' + dayjs().format('YYYYMMDDHHmmss') + '.xlsx');
            ctx.set('content-disposition', `attachment; filename* = UTF-8''${fileName}`);
            ctx.status = 200;
            await workbook.xlsx.write(ctx.res);
            ctx.res.end();

        }else{
            ctx.body = {
                result: 'false',
                resultDes: '操作失败'
            }
        }
    }

    async delete(){
        const { ctx } = this;
        let query = ctx.request.body;
        if (!query.id) {
            ctx.body = {
                result: 'false',
                resultDes:'id不能为空'
            }
            return;
        }
        const result = await ctx.service.languageFields.delete(query);
        ctx.body = result || {
            result: 'false',
            resultDes: '操作失败'
        }
    }

    //导出json
    async exportJson(){
        const { ctx } = this;
        const query = ctx.request.body;
        const lib_id = query.lib_id; //语言包id
        const lib_lang = query.lib_lang; //语言包语言类型
        if (!lib_id) {
            ctx.body = {
                result: 'false',
                resultDes:'语言包id(lib_id)不能为空'
            }
            return;
        }
        if (!lib_lang) {
            ctx.body = {
                result: 'false',
                resultDes:'语言包类型(lib_lang)不能为空'
            }
            return;
        }
        const result = await ctx.service.languageFields.exportJson({lib_id});
        if(result.result == 'true'){
            const list = result.list || [];
            ctx.body = {
                result:'true',
                jsonList:list
            }

        }else{
            ctx.body = {
                result: 'false',
                resultDes: '操作失败'
            }
        }
    }

    async getRecycleList(){
        const { ctx } = this;
        let query = ctx.request.body;
        if (!query.pageSize) {
            ctx.body = {
                result: 'false',
                resultDes:'pageSize不能为空'
            }
            return;
        }
        if (!query.pageNo) {
            ctx.body = {
                result: 'false',
                resultDes:'pageNo不能为空'
            }
            return;
        }
        const result = await ctx.service.languageFields.getRecycleList(query);
        ctx.body = result || {
            result: 'false',
            resultDes: '操作失败'
        }
    }

    async findHistoryTranslate(){
        const { ctx } = this;
        let query = ctx.request.body;
        if (!query.pageSize) {
            ctx.body = {
                result: 'false',
                resultDes:'pageSize不能为空'
            }
            return;
        }
        if (!query.pageNo) {
            ctx.body = {
                result: 'false',
                resultDes:'pageNo不能为空'
            }
            return;
        }
        if (!query.keyword) {
            ctx.body = {
                result: 'false',
                resultDes:'关键词不能为空'
            }
            return;
        }
        if (!query.id) {
            ctx.body = {
                result: 'false',
                resultDes:'id不能为空'
            }
            return;
        }
        const result = await ctx.service.languageFields.findHistoryTranslate(query);
        ctx.body = result || {
            result: 'false',
            resultDes: '操作失败'
        }
    }

    /**
     * 获取模块列表
     * */
    async getModuleListFromFields(){
        const { ctx } = this;
        let query = ctx.request.body;
        if (!query.lib_id) {
            ctx.body = {
                result: 'false',
                resultDes:'语言包id不能为空'
            }
            return;
        }
        const result = await ctx.service.languageFields.getModuleListFromFields(query);
        ctx.body = result || {
            result: 'false',
            resultDes: '操作失败'
        }
    }

}

module.exports = FieldsController;
